package io.github.frailty9.crserver.utils
// DateUtils.kt

import java.time.DayOfWeek
import java.time.LocalDate
import java.time.temporal.ChronoUnit
import java.time.temporal.TemporalAdjusters

/**
 * 日期返回模型
 * @property start 起始日期
 * @property end 截止日期
 */
data class DateRange(
    val start: LocalDate,
    val end: LocalDate
) {
    companion object {
        /**
         * 创建一个周期(起止同一天)
         */
        fun ofDaily(anchor: LocalDate): DateRange {
            return DateRange(anchor, anchor)
        }

        /**
         * 创建一个周期(日期所在的周，默认以周一为每周的第一天)
         */
        fun ofWeekly(anchor: LocalDate): DateRange {
            return DateRange(
                anchor.with(DayOfWeek.MONDAY),
                anchor.with(DayOfWeek.SUNDAY)
            )
        }

        /**
         * 创建一个周期(日期所在月)
         */
        fun ofMonthly(anchor: LocalDate): DateRange {
            return DateRange(
                anchor.with(TemporalAdjusters.firstDayOfMonth()),
                anchor.with(TemporalAdjusters.lastDayOfMonth())
            )
        }
    }
}

object DateUtils {
    /**
     * 生成指定日期范围内每一天的LocalDate
     * @param start 起始日期
     * @param end 截止日期
     * @return 列表包含每一天的LocalDate对象
     */
    fun eachDays(start: LocalDate, end: LocalDate): List<LocalDate> {
        if (start > end) return emptyList()
        return (0..ChronoUnit.DAYS.between(start, end).toInt())
            .map { start.plusDays(it.toLong()) }
    }

    fun eachDays(dateRange: DateRange) = eachDays(dateRange.start, dateRange.end)
}